﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace 序列化工具
{
    public class  值结构
    {
        /// <summary>
        /// 返回本成员类型的绝对路径
        /// </summary>
        public string 绝对路径;
        /// <summary>
        /// 返回本成员以文本存储的类型名称
        /// </summary>
        public string 类型文本;
        /// <summary>
        /// 返回成员以文本存储的值
        /// </summary>
        public string 值文本;
        /// <summary>
        /// 返回成员的确切类型
        /// </summary>
        public Type 类型;
        /// <summary>
        /// 取得成员的层级数据，若整理过
        /// </summary>
        public List<string> 层级数据 = new List<string>();
        /// <summary>
        /// 取得成员的每个层级的类型，若整理过
        /// </summary>
        public List<string> 层级父类型 = new List<string>();
        /// <summary>
        /// 取得列表大小，调试使用
        /// </summary>
        public Dictionary<int,int> 列表大小查询 = new Dictionary<int, int>();

        /// <summary>
        /// 整理层级数据，之后可方便其他类使用
        /// </summary>
        /// <param name="值结构组"></param>
        /// <returns></returns>
        public static List<值结构> 整理层级数据(List<值结构> 值结构组)
        {
            值结构组.ForEach((x) =>
            {
                x.层级数据  = x.绝对路径.Split('#').ToList(); 
                if (x.层级数据 == null) //实际上未截取的都为1
                { 
                    x.层级数据 = new List<string>() { x.绝对路径  };
                    x.层级父类型.Add(截取尖括号内文本(x.绝对路径));
                }
            });

            值结构组.ForEach((x) => 
            {
                int 层级 = 0;
                x.层级数据.ForEach((y) =>
                {
                    var 类型 = 截取尖括号内文本(y);
                    x.层级父类型.Add(类型);
                    if (类型 == "List") { x.列表大小查询.Add(层级, int.Parse(截取方括号内文本(y)));  }
                    if (类型 == "Dict") { x.列表大小查询.Add(层级, int.Parse(截取方括号内文本(y)));  }
                    层级++;
                });
            });

            return 值结构组;
        }

        private static string 截取尖括号内文本(string 文本)
        {
            int 左指针 = 文本.IndexOf('<');
            if (左指针 == -1) { return 文本.Split('[').FirstOrDefault(); }
            int 右指针 = 文本.IndexOf('>');
            return 文本.Substring(左指针+1, 右指针 - 左指针-1);
        }


        private static string 截取方括号内文本(string 文本)
        {
            int 左指针 = 文本.IndexOf('[');
            int 右指针 = 文本.IndexOf(']');
            return 文本.Substring(左指针 + 1, 右指针 - 左指针 - 1);
        }
    }
}
